package question11_15;


/**
 * @description: 输入一个整数，输出该数32位二进制表示中1的个数。其中负数用补码表示。
 * @author: jhy
 * @time: 2021/5/22 13:22
 */
public class Question15 {

    public static void main(String[] args) {

        Question15 question15 = new Question15();
        int i = question15.NumberOf1(10);
        System.out.println(i);


    }


    //思路：与运算：全为1则为1，否则为0--->0&0=0；0&1=0；1&0=0；1&1=1
    //循环32次，每次判断(从右向左数第i位是否为1)
    public int NumberOf1(int n) {

        int count = 0;
        int temp = 1;
        for(int i = 0;i < 32;i++){
            if((n & temp) == temp){ //n从右向左数第i位为1
                count++;
            }
            temp = temp << 1;
        }

        return count;
    }

    //思路：把一个整数减去1，再和原来的整数做与运算，会把该整数最右边的1变为0，
    //那么一个整数的二进制表示中有多少个1，就可以进行多少次这样的操作
    public int NumberOf1sec(int n) {

        int count = 0;
        while (n != 0){
            count++;
            n = (n-1)&n;
        }
        return count;
    }



}
